/*{
author=黑店小小二
version=1.0
date=2022/10/29
}*/
/***
兔神（@茕茕）为大浪淘沙mod设计的部分武将特殊的事件效果，后取消之。
此版本权当备份，视情况开启。

诸葛亮死亡：姜维统/武+3, 最高适性+1。第三特技变为「志承」（辅佐+洞察+拱戍）
关羽死亡： 关平统武+8，关兴关索统武+2;关平第三特技变为神将
张飞死亡： 张苞统武+2，第三特技「枪将」变「枪神」
关羽张飞具死亡：刘备统+10，性格变莽撞
貂蝉死亡：吕布是貂蝉配偶，则第一特技变为「弑天」（飞将+巧变+掠阵+激励），去除第二三特技
甘宁击溃部队数 >= 20：获得称号「锦帆游侠」，第二特技「水将」变「威风」, 第三特技「威风」变「锦帆」（推进+操舵+水神+军魂）
马腾死亡：马超第一特技「骑神」变为「复仇」（长驱+骑神+军魂+掠阵）
潘凤、邢道荣击溃部队数 >= 50：获得称号「无双上将」，第一特技变为「上将」（昂扬+金刚+猛者+扫讨+激昂），去除第二三特技
张辽击溃为君主的孙权部队：第二特技「要击」变「夺锐」（拱戍+要击+破竹+军魂）, 去除第三特技 @祈愿 @公孙越 @无限未来 @ 好想时光倒流
张任击溃庞统部队：获得称号「索命神射」，第二特技「不屈」变「落凤」（拱戍+不屈+轻甲+善射），去除第三特技

***/

// ## 2022/10/29 # 黑店小小二 # 武将死亡变动提取为单独文件 ##

namespace 武将特殊事件
{

  /*[text=开启诸葛死亡事件 tip=开关 default=true]*/
  const bool 诸葛死亡姜维事件 = true;
  /*[text=开启关羽死亡事件 tip=开关 default=true]*/
  const bool 关羽死亡事件 = true;
  /*[text=开启张飞死亡事件 tip=开关 default=true]*/
  const bool 张飞死亡事件 = true;
  /*[text=开启关张死亡事件 tip=开关 default=true]*/
  const bool 关张死亡事件 = true;
  /*[text=开启貂蝉死亡事件 tip=开关 default=true]*/
  const bool 貂蝉死亡事件 = true;
  /*[text=开启马腾死亡事件 tip=开关 default=true]*/
  const bool 马腾死亡事件 = true;

  class Main {

    Main()
    {
      pk::bind(151, pk::trigger151_t(onPersonDied));
      pk::bind(175, 1000, pk::trigger175_t(onUnitDestory));
      pk::bind2(102, pk::trigger102_t(onLoadData), -1);
    }

    void onPersonDied(pk::person@ self, pk::person@ by, pk::hex_object@ where, pk::person@ succ, int type, int rettype)
    {
      person_died(self.get_id(), self);
    }

    void onUnitDestory(pk::unit@ attacker, pk::unit@ target)
    {
      if (!ch::is_new_face(武将_甘宁) and pk::has_member(attacker, 武将_甘宁))
      {
        pk::person@ 甘宁 = pk::get_person(武将_甘宁);
        auto sc_person = ch::get_person_p(武将_甘宁);
        if (sc_person.kill_unit >= 20 and 甘宁 !is null and 甘宁.skill2 == 特技_水将 and 甘宁.skill3 == 特技_威风)
        {
          甘宁.skill2 = 特技_锦帆;
          甘宁.skill3 = -1;
          pk::add_kouseki(甘宁, 3000);
          甘宁.name_read = pk::encode("锦帆游侠");
          pk::core::update_person(武将_甘宁);
          历史日志(甘宁, "\x1b[2x击溃累计20只部队\x1b[0x", '功绩上升\x1b[16x3000\x1b[0x，获得【\x1b[16x锦帆游侠\x1b[0x】称号，第二特技变为【\x1b[16x锦帆\x1b[0x】');
        }
      }

      if (!ch::is_new_face(武将_张辽) and pk::has_member(attacker, 武将_张辽) and !ch::is_new_face(武将_孙权) and pk::has_member(target, 武将_孙权))
      {
        pk::person@ 张辽 = pk::get_person(武将_张辽);
        pk::person@ 孙权 = pk::get_person(武将_孙权);
        if (张辽 !is null and 张辽.skill2 == 特技_要击 and 张辽.skill3 == 特技_军魂 and 孙权 !is null and pk::is_kunshu(孙权))
        {
          张辽.skill2 = 特技_夺锐;
          张辽.skill3 = -1;
          pk::add_kouseki(张辽, 3000);
          张辽.name_read = pk::encode("虎啸逍遥");
          pk::core::update_person(武将_张辽);
          历史日志(张辽, "\x1b[2x击溃孙权部队\x1b[0x", '功绩增加\x1b[16x3000\x1b[0x，获得【\x1b[16x虎啸逍遥\x1b[0x】称号，第二特技变为【\x1b[16x夺锐\x1b[0x】');
        }
      }

      if (!ch::is_new_face(武将_张任) and pk::has_member(attacker, 武将_张任) and !ch::is_new_face(武将_庞统) and pk::has_member(target, 武将_庞统))
      {
        pk::person@ 张任 = pk::get_person(武将_张任);
        if (张任 !is null and 张任.skill2 == 特技_不屈 and 张任.skill3 == 特技_轻甲)
        {
          张任.skill2 = 特技_落凤;
          张任.skill3 = -1;
          pk::add_kouseki(张任, 3000);
          张任.name_read = pk::encode("索命神射");
          pk::core::update_person(武将_庞统);
          历史日志(张任, "\x1b[2x击溃庞统部队\x1b[0x", '功绩增加\x1b[16x3000\x1b[0x，获得【\x1b[16x索命神射\x1b[0x】称号，第二特技变为【\x1b[16x落凤\x1b[0x】');
        }
      }

      if (!ch::is_new_face(武将_潘凤) and pk::has_member(attacker, 武将_潘凤))
      {
        pk::person@ 潘凤 = pk::get_person(武将_潘凤);
        auto sc_person = ch::get_person_p(武将_潘凤);
        if (sc_person.kill_unit >= 50 and 潘凤 !is null and 潘凤.skill == 特技_猛卒 and 潘凤.skill2 == 特技_金刚)
        {
          潘凤.skill = 特技_上将;
          潘凤.skill2 = -1;
          潘凤.skill3 = -1;
          潘凤.name_read = pk::encode("无双上将");
          ch::add_stat_exp(潘凤, 武将能力_武力, 500, 潘凤.is_player());
          pk::core::update_person(武将_潘凤);
          历史日志(潘凤, "\x1b[2x击溃累计50只部队\x1b[0x", '获得【\x1b[16x无双上将\x1b[0x】称号，武力+\x1b[16x5\x1b[0x，第一特技变为【\x1b[16x上将\x1b[0x】');
        }
      }

      if (!ch::is_new_face(武将_邢道荣) and pk::has_member(attacker, 武将_邢道荣))
      {
        pk::person@ 邢道荣 = pk::get_person(武将_邢道荣);
        auto sc_person = ch::get_person_p(武将_邢道荣);
        if (sc_person.kill_unit >= 50 and 邢道荣 !is null and 邢道荣.skill == 特技_猛卒)
        {
          邢道荣.skill = 特技_上将;
          邢道荣.skill2 = -1;
          邢道荣.skill3 = -1;
          邢道荣.name_read = pk::encode("无双上将");
          ch::add_stat_exp(邢道荣, 武将能力_武力, 500, 邢道荣.is_player());
          pk::core::update_person(武将_邢道荣);
          历史日志(邢道荣, "\x1b[2x击溃累计50只部队\x1b[0x", '获得【\x1b[16x无双上将\x1b[0x】称号，武力+\x1b[16x5\x1b[0x，第一特技变为【\x1b[16x上将\x1b[0x】');
        }
      }
    }

    void onLoadData()
    {
      if (!pk::get_scenario().loaded)
      {
        array<int> person_ids = { 武将_诸葛亮, 武将_关羽, 武将_张飞, 武将_貂蝉, 武将_马腾 };
        for (int i = 0; i < int(person_ids.length); i += 1)
        {
          int id = person_ids[i];
          pk::person@ person = pk::get_person(id);
          if (person.mibun == 身分_死亡 or ch::is_new_face(id))
          {
            person_died(id, person);
          }
        }
      }
    }

    void person_died(int id, pk::person@ self)
    {
      if (!pk::is_valid_person_id(id)) return;
      if (!ch::is_new_face(id))
      {
        if (id == 武将_诸葛亮 and 诸葛死亡姜维事件)
        {
          pk::person@ person = checkout_person(武将_姜维);

          if (person !is null and person.skill3 != 特技_志承)
          {
            ch::add_stat_exp(person, 武将能力_武力, 300, person.is_player());
            ch::add_stat_exp(person, 武将能力_统率, 300, person.is_player());
            int best_ts = person.tekisei[兵种_枪兵];
            int best_ts_type = 兵种_枪兵;
            for (int i = 兵种_戟兵; i <= 兵种_水军; i += 1)
            {
                if (person.tekisei[i] > best_ts)
                {
                    best_ts = person.tekisei[i];
                    best_ts_type = i;
                }
            }
            pk::add_heishu_exp(person, best_ts_type, 250);
            if (person.skill3 == -1) person.skill3 = 特技_志承;
            pk::core::update_person(武将_姜维);
            历史日志(person, "\x1b[2x诸葛亮\x1b[0x死亡", '第三特技变为【\x1b[16x志承\x1b[0x】');
          }
        }
        if (id == 武将_关羽)
        {
          if (关羽死亡事件)
          {
            pk::person@ 关平 = checkout_person(武将_关平);
            pk::person@ 关兴 = checkout_person(武将_关兴);
            pk::person@ 关索 = checkout_person(武将_关索);
            if (关平 !is null and 关平.skill3 != 特技_神将)
            {
              ch::add_stat_exp(关平, 武将能力_武力, 800, 关平.is_player());
              ch::add_stat_exp(关平, 武将能力_统率, 800, 关平.is_player());
              if (关平.skill3 == -1) 关平.skill3 = 特技_神将;
              关平.update();
              历史日志(关平, "\x1b[2x关羽\x1b[0x死亡", '第三特技变为【\x1b[16x神将\x1b[0x】');
            }
            if (关兴 !is null)
            {
              ch::add_stat_exp(关兴, 武将能力_武力, 200, 关兴.is_player());
              ch::add_stat_exp(关兴, 武将能力_统率, 200, 关兴.is_player());
            }
            if (关索 !is null)
            {
              ch::add_stat_exp(关索, 武将能力_武力, 200, 关索.is_player());
              ch::add_stat_exp(关索, 武将能力_统率, 200, 关索.is_player());
            }
          }

          if (关张死亡事件)
          {
            pk::person@ 张飞 = checkout_person(武将_张飞);
            if (张飞 is null or 张飞.mibun == 身份_死亡)
            {
              pk::person@ 刘备 = checkout_person(武将_刘备);
              if (刘备 !is null and 刘备.character != 性格_莽撞)
              {
                ch::add_stat_exp(刘备, 武将能力_统率, 1000, 刘备.is_player());
                刘备.character = 性格_莽撞;
                刘备.update();
                历史日志(刘备, "\x1b[2x关羽张飞\x1b[0x死亡", '统率上升\x1b[16x10\x1b[0x，性格变为\x1b[16x莽撞\x1b[0x');
              }
            }
          }
        }
        if (id == 武将_张飞)
        {
          if (张飞死亡事件)
          {
            pk::person@ 张苞 = checkout_person(武将_张苞);
            if (张苞 !is null and 张苞.skill3 != 特技_枪神)
            {
              ch::add_stat_exp(张苞, 武将能力_武力, 200, 张苞.is_player());
              ch::add_stat_exp(张苞, 武将能力_统率, 200, 张苞.is_player());
              if (张苞.skill3 == 特技_枪将) 张苞.skill3 = 特技_枪神;
              张苞.update();
              历史日志(张苞, "\x1b[2x张飞\x1b[0x死亡", '第三特技变为【\x1b[16x枪神\x1b[0x】');
            }
          }

          if (关张死亡事件)
          {
            pk::person@ 关羽 = checkout_person(武将_关羽);
            if (关羽 is null or 关羽.mibun == 身份_死亡)
            {
              pk::person@ 刘备 = checkout_person(武将_刘备);
              if (刘备 !is null and 刘备.character != 性格_莽撞)
              {
                ch::add_stat_exp(刘备, 武将能力_统率, 1000, 刘备.is_player());
                刘备.character = 性格_莽撞;
                刘备.update();
                历史日志(刘备, "\x1b[2x关羽张飞\x1b[0x死亡", '统率上升\x1b[16x10\x1b[0x，性格变为\x1b[16x莽撞\x1b[0x');
              }
            }
          }
        }
        if (id == 武将_貂蝉)
        {
          if (貂蝉死亡事件)
          {
            pk::person@ 吕布 = checkout_person(武将_吕布);
            if (吕布 !is null and self.spouse == 武将_吕布 and 吕布.skill == 特技_飞将)
            {
              吕布.skill = 特技_弑天;
              吕布.skill2 = -1;
              吕布.skill3 = -1;
              pk::core::update_person(武将_吕布);
              pk::say(pk::encode("是谁,杀了我的貂蝉!!"), 吕布, pk::get_hex_object(吕布.location));
              历史日志(吕布, "\x1b[2x貂蝉\x1b[0x死亡", '第一特技变为【\x1b[16x弑天\x1b[0x】');
            }
          }
        }
        if (id == 武将_马腾)
        {
          if (马腾死亡事件)
          {
            pk::person@ 马超 = checkout_person(武将_马超);
            if (马超 !is null and 马超.father == 武将_马腾 and 马超.skill == 特技_骑神)
            {
              马超.skill = 特技_复仇;
              pk::core::update_person(武将_马超);
              历史日志(马超, "\x1b[2x马腾\x1b[0x死亡", '第一特技变为【\x1b[16x复仇\x1b[0x】');
            }
          }
        }
      }
    }

    pk::person@ checkout_person(int person_id)
    {
      if (!pk::is_valid_person_id(person_id)) return null;
      pk::person@ person = pk::get_person(person_id);
      if (!ch::is_new_face(person_id)) return person;
      return null;
    }
  }

  Main main;

  void 历史日志(pk::person@ person, string name, string result)
  {
    string person_name = pk::format("\x1b[1x{}\x1b[0x", pk::decode(pk::get_name(person)));
    string action_name = pk::format("\x1b[27x{}\x1b[0x", name);

    string str = pk::format("{}由于{}，{}", person_name, action_name, result);

    pk::unit@ unit = pk::get_unit(pk::hex_object_id_to_unit_id(person.location));
    pk::building@ building = pk::get_building(pk::hex_object_id_to_building_id(person.location));
    pk::point persion_pos = unit !is null ?  unit.pos : building.pos;
    
    pk::force@ person_force = pk::get_force(person.get_force_id());
    int color = person_force is null ? -1 : person_force.color;
    pk::history_log(persion_pos, color, pk::encode(str));
  }
}


